home *** CD-ROM | disk | FTP | other *** search
/ Die Ultimative Software-P…i Collection 1996 & 1997 / Die Ultimative Software-Pakete CD-ROM fur Atari Collection 1996 & 1997.iso / p / paintcol / compress / ca_unpac.s < prev   
Encoding:
Text File  |  1996-10-30  |  4.6 KB  |  134 lines

  1.  
  2. ; Dekomprimierung von CRACK ART Bildern (CA?)
  3. ; Copyright © Detlef Röttger 04.03.1990
  4.  
  5. ; GFA-Aufruf: ~C:CA_DECOMPRESS%( l:Quelle, l:Ziel )
  6.  
  7.                 TEXT
  8.  
  9.                 movem.l   d1-a6,-(sp)
  10.  
  11.                 movem.l   60(sp),a0-a1  ; Quelle/Ziel
  12.                 movea.l   a1,a2
  13.                 lea       32000(a1),a3
  14.  
  15.                 clr.w     d7
  16.                 clr.w     d6
  17.                 move.b    (a0)+,d7      ; ESC
  18.                 move.b    (a0)+,d6      ; DELTA
  19.  
  20.                 move.w    (a0)+,d0      ; Offset
  21.                 and.l     #$7fff,d0
  22.                 movea.l   d0,a5
  23.  
  24.                 move.b    d6,d1         ; DELTA in Langwoerter bringen
  25.                 lsl.w     #8,d1
  26.                 move.b    d6,d1
  27.                 move.w    d1,d2
  28.                 swap      d1
  29.                 move.w    d2,d1
  30.                 move.l    d1,d2
  31.                 move.l    d1,d3
  32.                 move.l    d1,d4
  33.                 move.l    d1,d5
  34.  
  35.                 movea.l   a3,a6         ; Ziel mit DELTA fuellen
  36.                 move.w    #1599,d0
  37. delta:          movem.l   d1-d5,-(a6)
  38.                 dbra      d0,delta
  39.  
  40.                 move.l    a5,d0         ; Offset
  41.                 subq.w    #1,d0         ; Durchlaeufe
  42.                 bmi.s     endmain
  43. main:           clr.w     d1
  44.                 move.b    (a0)+,d1      ; Erstes Byte holen
  45.                 cmp.b     d7,d1
  46.                 beq.s     esccode
  47.  
  48. writeone:       move.b    d1,(a2)       ; Wenn kein ESC, dann gleich schreiben
  49.                 adda.l    a5,a2
  50.                 cmpa.l    a3,a2
  51.                 blt.s     main
  52.                 addq.l    #1,a1
  53.                 movea.l   a1,a2
  54.                 dbra      d0,main
  55.  
  56. endmain:        movem.l   (sp)+,d1-a6
  57.                 rts
  58.  
  59. ; Hier wurde ein ESC gefunden
  60.  
  61. esccode:        move.b    (a0)+,d1      ; zweites Byte
  62.                 cmp.b     d7,d1
  63.                 beq.s     writeone      ; ESC schreiben
  64.  
  65.                 tst.b     d1            ; COMP0
  66.                 bne.s     code1
  67.                 clr.w     d2            ; ESC 00 ANZAHL-1 BYTE
  68.                 move.b    (a0)+,d2      ; Anzahl 3-255 ist bedeutet 4-256
  69.                 move.b    (a0)+,d1      ; gleiche Bytes
  70. loop0:          move.b    d1,(a2)
  71.                 adda.l    a5,a2
  72.                 cmpa.l    a3,a2
  73.                 blt.s     drin0
  74.                 addq.l    #1,a1
  75.                 movea.l   a1,a2
  76.                 subq.w    #1,d0         ; Ueberschlag gemacht
  77.                 bmi.s     endmain
  78. drin0:          dbra      d2,loop0
  79.                 bra.s     main
  80.  
  81. code1:          cmpi.b    #1,d1         ; COMP1
  82.                 bne.s     code2
  83.                 clr.w     d2            ; ESC 01 MULT REST-1 BYTE
  84.                 clr.w     d3
  85.                 move.b    (a0)+,d3      ; Multiplikator
  86.                 lsl.w     #8,d3
  87.                 move.b    (a0)+,d2      ; Anzahl 1-256
  88.                 add.w     d3,d2
  89.                 move.b    (a0)+,d1      ; komprimiertes Byte
  90. loop1:          move.b    d1,(a2)
  91.                 adda.l    a5,a2
  92.                 cmpa.l    a3,a2
  93.                 blt.s     drin1
  94.                 addq.l    #1,a1
  95.                 movea.l   a1,a2
  96.                 subq.w    #1,d0         ; Ueberschlag gemacht
  97.                 bmi.s     endmain
  98. drin1:          dbra      d2,loop1
  99.                 bra.s     main
  100.  
  101. code2:          cmpi.b    #2,d1         ; SAME
  102.                 bne.s     multiple      ; Komprimiert 3<n<=256
  103.                 clr.w     d3
  104.                 move.b    (a0)+,d3      ; Multiplikator
  105.                 beq.s     endmain       ; Abbruchcode ESC 02 00
  106.                 lsl.w     #8,d3
  107.                 clr.w     d2            ; ESC 02 MULT REST-1
  108.                 move.b    (a0)+,d2      ; Anzahl 1-256
  109.                 add.w     d3,d2
  110. loop2:          adda.l    a5,a2         ; DELTAs 'schreiben'
  111.                 cmpa.l    a3,a2
  112.                 blt.s     drin2
  113.                 addq.l    #1,a1
  114.                 movea.l   a1,a2
  115.                 subq.w    #1,d0         ; Ueberschlag gemacht
  116.                 bmi.s     endmain
  117. drin2:          dbra      d2,loop2
  118.                 bra       main
  119.  
  120. multiple:       clr.w     d2            ; ESC ANZAHL-1 BYTE
  121.                 move.b    (a0)+,d2      ; Byte
  122. loop3:          move.b    d2,(a2)
  123.                 adda.l    a5,a2
  124.                 cmpa.l    a3,a2
  125.                 blt.s     drin3
  126.                 addq.l    #1,a1
  127.                 movea.l   a1,a2
  128.                 subq.w    #1,d0         ; Ueberschlag gemacht
  129.                 bmi       endmain
  130. drin3:          dbra      d1,loop3
  131.                 bra       main
  132.  
  133.                 END
  134.